package fr.utbm.tx52.contactsManagement;

import fr.utbm.tx52.R;
import fr.utbm.tx52.dataManagement.DataManager;
import fr.utbm.tx52.reception.PullService;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.ArrayList;
import java.util.Collections;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

/**
 * Ecran qui va afficher la liste des contacts de l'application avec la possibilité d'en ajouter d'autres via le menu
 */
public class ContactList extends ListActivity {

	/**
	 * Identifiant de l'action "ajouter un contact"
	 */
	private static final int PICK_CONTACT = 1989;

	/**
	 * Liste des contacts affichés
	 */
	private List<Contact> contacts;

	
	/**
	 * Liste des invitations en attente (le numéro de téléphone)
	 * 
	 * Il faudrait une méthode getContactFormPhoneNumber
	 */
	private static List<String> waitingList = new ArrayList<String>();
	
	public static void addContactInWaitingList(String phoneNumber) {
		waitingList.add(phoneNumber);
	}
	
	private void parseWaitingList()
	{
		final Activity a = this;
		
		for (String number : waitingList) {
			
			final Contact c = Contact.getContactsByPhone(this, number);
			
			Log.d(getClass().getName(), c.getName());
			
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setMessage("Voulez-vous ajouter " + (c!=null ? c.getName() : "") + " (" + number + ") aux contacts de l'application ?")
				.setCancelable(false)
				.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {
						DataManager.addAssociatedContacts(a, c);
						drawContactsList();
					}
				})
			.setNegativeButton("Non", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					dialog.cancel();
				}
			});
			builder.create().show();
		}
		
		waitingList.clear();
	}

	/** Called when the activity is first created. */
	@Override
		public void onCreate(Bundle savedInstanceState) {

			super.onCreate(savedInstanceState);
			
			drawContactsList();
			
			final Activity a = this;
			
			// gestion du clique pour supprimer un contact
			getListView().setOnItemClickListener(new OnItemClickListener() {

				public void onItemClick(AdapterView<?> parent, View v, int pos, long arg3) {

					final Integer id = Integer.parseInt(((Contact)parent.getItemAtPosition(pos)).id);
					final Contact c = Contact.getContactFromID(a, id.toString());

					AlertDialog.Builder builder = new AlertDialog.Builder(parent.getContext());
					builder.setMessage("Voulez-vous retirer " + c.getName() + " des contacts de cette application ?")
				.setCancelable(false)
				.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {
						DataManager.removeAssociatedContacts(getApplicationContext(), c);
						drawContactsList();
					}
				})
			.setNegativeButton("Non", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					dialog.cancel();
				}
			});
			builder.create().show();

				}
			});

			PullService.cancelNotification(getApplicationContext());
			parseWaitingList();
		}

	
	@Override
	public void onStart() {
		super.onStart();
	}

	/**
	 * Obtient la liste des contacts associés
	 *
	 * @param a
	 * 			L'activité qui demande la liste
	 *
	 * @return La liste des contacts associés à l'application
	 */
	public static List<Contact> getAssociatedContactList(Activity a)
	{
		List<Contact> l = new ArrayList<Contact>();

		Map<Integer,String> associatedContacts = DataManager.loadAssociatedContacts(a.getApplicationContext());
		Set<Integer> contactsIds = associatedContacts.keySet();

		for (Integer id : contactsIds) {

			Uri dataUri = ContactsContract.Data.CONTENT_URI;

			String[] projection = new String[] {
				ContactsContract.Contacts.DISPLAY_NAME,
					ContactsContract.CommonDataKinds.Phone.CONTACT_ID
			};

			Cursor c = a.managedQuery(
					dataUri,
					projection,
					ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id.toString(),
					null, null);

			a.startManagingCursor(c);
			if (c.moveToFirst()) {

				String name = c.getString(0);

				Bitmap photo = Contact.loadContactPhoto(a.getApplicationContext(), Long.decode(id.toString()));

				Contact co = new Contact(
						name,
						photo,
						id.toString(),
						associatedContacts.get(id)
						);

				l.add(co);
			}
		}

		Collections.sort(l);

		return l;
	}


	/**
	 * Affiche la liste des contacts dans le tableau
	 */
	private void drawContactsList() {
		contacts = getAssociatedContactList(this);
		setListAdapter(new ContactsAdapter(this, contacts));
		if ( contacts.isEmpty() ) {
			Toast.makeText(getApplicationContext(), "Aucun contact associé", Toast.LENGTH_SHORT).show();
		}
	}


	@Override
		/**
		 * Création du menu qui permet d'ajouter un contact
		 */
		public boolean onCreateOptionsMenu(Menu menu) {
			MenuInflater inflater = getMenuInflater();
			inflater.inflate(R.menu.contactmenu, menu);
			return true;
		}


	/**
	 * Sélection d'un item du menu
	 */
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
			case R.id.addcontact :

				Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
				startActivityForResult(intentContact, PICK_CONTACT);

				return true;
		}

		return false;
	}


	@Override
		/**
		 * Une activitée se termine, la selection d'un contact dans notre cas
		 */
		public void onActivityResult(int requestCode, int resultCode, Intent intent) {

			if (resultCode == RESULT_CANCELED) {
				return;
			}

			if (requestCode == PICK_CONTACT)
			{
				Contact newContact = getContactID(intent);
				if (newContact == null) {
					return;
				}
				DataManager.addAssociatedContacts(this, newContact);
				drawContactsList();
			}
		}


	/**
	 * Renvoi un contact en fonction de l'intent donnée (qui est l'intent du listPicker en cas d'ajout de contact)
	 *
	 * @param intent
	 * 				L'intent d'ajout de contact
	 *
	 * @return	Le contact qui correspond
	 */
	protected Contact getContactID(Intent intent)
	{
		Cursor cursor =  managedQuery(intent.getData(), null, null, null, null);

		cursor.moveToNext();

		String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
		
		return Contact.getContactFromID(this, id);
	}
  

}







